import wx from 'weixin-js-sdk'
import { weChatApi } from '../apis/index'
let userAgent;
// #ifdef H5
userAgent = navigator && navigator.userAgent ? navigator.userAgent : false
// #endif
const ua = userAgent ? userAgent.toLowerCase() : ''
const isAndroid = userAgent.indexOf('Android') > -1 || userAgent.indexOf('Adr') > -1
const isiOS = !!userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)

const isInAndroidApp = !!(userAgent && userAgent.match('biXuan_android_')) && isAndroid
const isIniOSApp = !!(userAgent && (userAgent.match('biXuan_iOS_') || userAgent.match('sc.bisinuolan.cn'))) && isiOS // 过几个版本把 userAgent.match('sc.bisinuolan.cn') 去掉

let signUrl = ''

// 兼容旧版本APP 开始
window.__BSNLAPPCallHandler__ = (str) => {
  // this.appCallJs(str)
}
// 兼容旧版本APP 结束

// 这是必须要写的，用来创建一些设置
function setupWebViewJavascriptBridge(callback) {
  // Android使用
  if (isInAndroidApp) {
    if (window.WebViewJavascriptBridge) {
      callback(window.WebViewJavascriptBridge)
    } else {
      document.addEventListener(
        'WebViewJavascriptBridgeReady',
        () => {
          callback(window.WebViewJavascriptBridge)
        },
        false
      )
    }
    console.log('tag', '安卓')
    sessionStorage.phoneType = 'android'
  }

  // iOS使用
  if (isIniOSApp) {
    if (window.WebViewJavascriptBridge) {
      return callback(window.WebViewJavascriptBridge)
    }

    if (window.WVJBCallbacks) {
      return window.WVJBCallbacks.push(callback)
    }

    window.WVJBCallbacks = [callback]
    var WVJBIframe = document.createElement('iframe')
    WVJBIframe.style.display = 'none'
    WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__'
    document.documentElement.appendChild(WVJBIframe)
    setTimeout(() => {
      document.documentElement.removeChild(WVJBIframe)
    }, 0)
    console.log('tag', 'ios')
    sessionStorage.phoneType = 'ios'
  }
}

// 注册回调函数，第一次连接时调用 初始化函数(android需要初始化,ios不用)
setupWebViewJavascriptBridge((bridge) => {
  if (isAndroid) {
    // 初始化
    bridge.init((message, responseCallback) => {
      var data = {
        'Javascript Responds': 'Wee!'
      }
      responseCallback(data)
    })
  }
})

// js调APP方法 （参数分别为:  传给app的数据  回调 app提供的方法名）
function callHandler(data, callback, name = '__BSNLAPPLinkBridge__') {
  const jsonStr = JSON.stringify(data)
  // 兼容旧版本APP 开始
  let res
  if (window.APPCALL && window.APPCALL.__BSNLAPPLinkBridge__) {
    res = window.APPCALL.__BSNLAPPLinkBridge__(jsonStr)
    if (res && callback) {
      callback(res)
    }
  } else if (window.__BSNLAPPLinkBridge__) {
    res = window.__BSNLAPPLinkBridge__(jsonStr) // 兼容旧版本APP 结束
    if (res && callback) {
      callback(res)
    }
  } else if (window.webkit && window.webkit.messageHandlers) {
    res = window.webkit.messageHandlers.bixuanApp.postMessage(jsonStr)
    if (callback) {
      callback(res)
    }
  } else {
    setupWebViewJavascriptBridge((bridge) => {
      bridge.callHandler(name, jsonStr, callback)
    })
  }
}

// APP调js方法 （参数分别为: js提供的方法名  回调）
function registerHandler(name, callback) {
  setupWebViewJavascriptBridge((bridge) => {
    bridge.registerHandler(name, (data, responseCallback) => {
      callback(data, responseCallback)
    })
  })
}

// 是否是在微信内置浏览器
function isInWeChat() {
  if (ua.match(/MicroMessenger/i)) {
    return ua.match(/MicroMessenger/i).toString() === 'micromessenger'
  } else {
    return false
  }
}
// 微信js-sdk 配置
const menuListBrowser = ['menuItem:openWithQQBrowser', 'menuItem:openWithSafari']
const menuListShare = ['menuItem:share:appMessage', 'menuItem:share:timeline']
async function setWeChatConfig(type = 'init', option) {
  if (type === 'init' || (isAndroid && signUrl !== location.href)) {
    signUrl = location.href
    const query = {
      url: signUrl
    }
    if (process.env.VUE_APP_BUILD_TYPE === 'UAT') {
      query.wxAppId = 'wxd49eddfdb4ebae90'
    }
    const res = await weChatApi.getWeChatSign(query)
    if (res.success && res.data) {
      wx.config({
        debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
        appId: res.data.app_id, // 必填，公众号的唯一标识
        timestamp: res.data.timestamp, // 必填，生成签名的时间戳
        nonceStr: res.data.nonce_str, // 必填，生成签名的随机串
        signature: res.data.signature, // 必填，签名，见附录1
        jsApiList: [
          'hideOptionMenu',
          'showOptionMenu',
          'hideMenuItems',
          'showMenuItems',
          'hideAllNonBaseMenuItem',
          'showAllNonBaseMenuItem',
          'onMenuShareTimeline',
          'onMenuShareAppMessage',
          'updateAppMessageShareData',
          'updateTimelineShareData',
          'closeWindow'
        ],
        openTagList: ['wx-open-launch-app, wx-open-launch-weapp']
      })
    }
  }

  wx.error(function(res) {
    const timer = setTimeout(setWeChatConfig, 2000)
    clearTimeout(timer)
  })

  wx.ready(function() {
    wx.hideAllNonBaseMenuItem()
    if (type === 'share' && option) {
      wx.onMenuShareTimeline({
        ...option,
        success: function() {
          console.log('share success')
        }
      })
      wx.onMenuShareAppMessage({
        ...option,
        success: function() {
          console.log('share success')// 用户点击了分享后执行的回调函数
        }
      })
      console.log('onMenuShareTimeline', option, option.title)
      wx.updateAppMessageShareData({
        ...option,
        success: function() {
          wx.hideAllNonBaseMenuItem()
          wx.showMenuItems({
            menuList: menuListShare
          })
        }
      })
      wx.updateTimelineShareData({
        ...option,
        success: function() {
          wx.hideAllNonBaseMenuItem()
          wx.showMenuItems({
            menuList: menuListShare
          })
        }
      })
    } else if (type === 'hide' && option) {
      setTimeout(() => {
        wx.showMenuItems({
          menuList: menuListBrowser
        })
      }, 100)
    }
  })
}

export default {
  // 是否是在微信内置浏览器
  isInWeChat: isInWeChat(),

  hideWeChatMenu: function(showOpenBrowserMenu) {
    setWeChatConfig('hide', showOpenBrowserMenu)
  },

  setWeChatConfig,

  initWeChatShare: function(option) {
    setWeChatConfig('share', option)
  },

  // 是否是在安卓 APP内
  isInAndroidApp,

  // 是否是在iOS APP内
  isIniOSApp,

  // 是否是在APP内
  isInApp: isInAndroidApp || isIniOSApp,

  // js调APP方法 （参数分别为:app提供的方法名  传给app的数据  回调）
  callHandler,

  // APP调js方法 （参数分别为:js提供的方法名  回调）
  registerHandler
}
